#!/usr/bin/env python3
"""
优化的ECS连接工具 - 处理网络不稳定情况
服务器IP: 8.140.59.178
"""

import subprocess
import time
import sys
from datetime import datetime

def optimized_ssh_connect(host, max_retries=3):
    """优化的SSH连接，处理网络不稳定"""
    print(f"🔗 尝试连接到 {host} (优化参数)")
    
    # 优化的SSH参数
    ssh_options = [
        '-o', 'ConnectTimeout=30',        # 增加连接超时时间
        '-o', 'ServerAliveInterval=10',   # 保活间隔
        '-o', 'ServerAliveCountMax=3',    # 保活次数
        '-o', 'TCPKeepAlive=yes',         # TCP保活
        '-o', 'StrictHostKeyChecking=no', # 跳过主机密钥检查
        '-o', 'UserKnownHostsFile=/dev/null', # 不保存主机密钥
        '-o', 'LogLevel=ERROR',           # 减少日志输出
        '-o', 'PasswordAuthentication=yes', # 允许密码认证
        '-o', 'PreferredAuthentications=password' # 优先密码认证
    ]
    
    for attempt in range(max_retries):
        print(f"📡 第 {attempt + 1} 次尝试连接...")
        
        try:
            # 构建SSH命令
            cmd = ['ssh'] + ssh_options + [f'root@{host}', 'echo "SSH连接成功"']
            
            print("执行命令:", ' '.join(cmd))
            print("请在弹出的密码提示中输入root密码...")
            
            # 执行SSH连接
            result = subprocess.run(cmd, timeout=60, text=True)
            
            if result.returncode == 0:
                print("✅ SSH连接成功！")
                return True
            else:
                print(f"❌ 第 {attempt + 1} 次尝试失败，返回代码: {result.returncode}")
                
        except subprocess.TimeoutExpired:
            print(f"❌ 第 {attempt + 1} 次尝试超时")
        except KeyboardInterrupt:
            print("\\n用户中断连接")
            return False
        except Exception as e:
            print(f"❌ 第 {attempt + 1} 次尝试异常: {str(e)}")
        
        if attempt < max_retries - 1:
            print(f"⏳ 等待5秒后重试...")
            time.sleep(5)
    
    print(f"❌ 所有连接尝试失败")
    return False

def test_simple_connection(host):
    """测试简单连接"""
    print(f"🔍 测试简单SSH连接到 {host}")
    
    try:
        cmd = [
            'ssh', 
            '-o', 'ConnectTimeout=15',
            '-o', 'StrictHostKeyChecking=no',
            f'root@{host}', 
            'echo "连接测试成功"'
        ]
        
        print("请输入root密码...")
        result = subprocess.run(cmd, timeout=30)
        
        if result.returncode == 0:
            print("✅ 简单连接测试成功")
            return True
        else:
            print("❌ 简单连接测试失败")
            return False
            
    except Exception as e:
        print(f"❌ 连接测试异常: {str(e)}")
        return False

def provide_alternative_methods():
    """提供替代连接方法"""
    print("\\n" + "="*60)
    print("           🔄 替代连接方法")
    print("="*60)
    
    print("\\n1. 📱 使用阿里云控制台远程连接:")
    print("   - 登录阿里云控制台")
    print("   - 进入ECS实例管理")
    print("   - 点击'远程连接' -> 'VNC远程连接'")
    print("   - 使用浏览器直接操作服务器")
    
    print("\\n2. 🔧 使用PuTTY (Windows):")
    print("   - 下载安装PuTTY")
    print("   - Host Name: 8.140.59.178")
    print("   - Port: 22")
    print("   - Connection Type: SSH")
    print("   - 点击Open连接")
    
    print("\\n3. 📡 使用VSCode Remote SSH:")
    print("   - 安装VSCode和Remote-SSH扩展")
    print("   - Ctrl+Shift+P -> Remote-SSH: Connect to Host")
    print("   - 输入: root@8.140.59.178")
    
    print("\\n4. 🌐 使用Web终端:")
    print("   - 搜索在线Web SSH客户端")
    print("   - 输入服务器信息进行连接")

def main():
    host = "8.140.59.178"
    
    print("="*60)
    print(f"  优化ECS连接工具 - {host}")
    print("="*60)
    print(f"连接时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
    print("="*60)
    
    print("\\n🎯 针对网络不稳定优化的连接方案")
    print("发现网络有25%丢包，使用优化参数重试...")
    
    # 尝试优化连接
    if optimized_ssh_connect(host):
        print("\\n🎉 连接成功！现在可以继续部署流程")
        
        # 询问是否继续部署
        continue_deploy = input("\\n是否现在继续部署服务器？(y/n): ").lower().strip()
        if continue_deploy == 'y':
            print("\\n继续部署流程...")
            print("运行以下命令继续部署:")
            print("python deploy_to_8_140_59_178.py")
        
    else:
        print("\\n❌ 优化连接仍然失败")
        provide_alternative_methods()
        
        print("\\n💡 建议:")
        print("1. 检查本地网络连接")
        print("2. 尝试使用手机热点")
        print("3. 使用阿里云控制台的VNC远程连接")
        print("4. 联系网络管理员检查防火墙设置")

if __name__ == "__main__":
    try:
        main()
    except KeyboardInterrupt:
        print("\\n\\n用户中断连接")
    except Exception as e:
        print(f"\\n\\n连接过程发生异常: {str(e)}")